/*
 * game_cfg.h
 *
 *  Created on: Nov 29, 2013
 *      Author: killerg
 */

#ifndef GAME_CFG_H_
#define GAME_CFG_H_

#include "share/cfg_file.h"
#include "share/cs_msg.pb.h"

struct game_cfg_t {
    bool init() {
        if (!file.load("game.txt"))
            return false;

        PetWashMaxLockNum         = file.get_int("PetWashMaxLockNum"          , 2         );
        PetRearExplodeProb        = file.get_int("PetRearExplodeProb"         , 150       );
        PetRearGameMoneyProb      = file.get_int("PetRearGameMoneyProb"       , 10000     );
        SpriteExplMaxNumMoney     = file.get_int("SpriteExplMaxNumMoney"      , 10        );
        FriCombatLevelDiff        = file.get_int("FriCombatLevelDiff"         , 516       );
        ArenaReward               = file.get_int("ArenaReward"                , 520       );
        ArenaCombatRewardWin      = file.get_int("ArenaCombatRewardWin"       , 518       );
        ArenaCombatRewardLose     = file.get_int("ArenaCombatRewardLose"      , 519       );
        HatchEggUnlock3Consume    = file.get_int("HatchEggUnlock3Consume"     , 433       );
        HatchEggUnlock4Consume    = file.get_int("HatchEggUnlock4Consume"     , 434       );
        PlayerCreateGivePet       = file.get_int("PlayerCreateGivePet"        , -1        );
        ArenaCombatNumPerDay      = file.get_int("ArenaCombatNumPerDay"       , 10        );
        PowerIncMinute            = file.get_int("PowerIncMinute"             , 5         );
        MaxPower                  = file.get_int("MaxPower"                   , 20        );
        MaxOccupyNum              = file.get_int("MaxOccupyNum"               , 10        );
        ArenaRankRewardHour       = file.get_int("ArenaRankRewardHour"        , 8         );
        ArenaRankRewardMinute     = file.get_int("ArenaRankRewardMinute"      , 30        );
        PlayerMedalInit           = file.get_int("PlayerMedalInit"            , 0         );
        EquipStarInit             = file.get_int("EquipStarInit"              , 3         );
        AttackAngryAddProb        = file.get_int("AttackAngryAddProb"         , 10000     );
        SkillAngryAddProb         = file.get_int("SkillAngryAddProb"          , 10000     );
        LuckyStarNum              = file.get_int("LuckyStarNum"               , 100       );
        LuckyStarRandSet          = file.get_int("LuckyStarRandSet"           , -1        );
        FirstChargeRewardId       = file.get_int("FirstChargeRewardId"        , -1        );
        BuyArenaCombatConsume     = file.get_int("BuyArenaCombatConsume"      , -1        );
        BuyOccupationConsume      = file.get_int("BuyOccupationConsume"       , -1        );
        ArenaCritCombatConsume    = file.get_int("ArenaCritCombatConsume"     , -1        );
        FriendCombatRewardNum 	  = file.get_int("FriendCombatRewardNum"      , 0         );
        MaxMailBoxNumOnline       = file.get_int("MaxMailBoxNumOnline"        , 10000     );
        ChatChannelSize           = file.get_int("ChatChannelSize"	          , 200	      );
        WorldBossLastMin		  = file.get_int("WorldBossLastMin"           , 60	      );
        WorldBossLastAttackReward = file.get_int("WorldBossLastAttackReward"  , -1	      );
        WorldBossCombatConsume	  = file.get_int("WorldBossCombatConsume" 	  , -1	      );
        WorldBossCombatTime		  = file.get_int("WorldBossCombatTime"	 	  , 10	      );
        DailyPowerNum		  	  = file.get_int("DailyPowerNum"		 	  , 20	      );
        ActNumAddPctPerSpeed      = file.get_double("SpeedAddActNumUnit"  	  , 0.005f    );
        WeekEndRewardExpRate	  = file.get_double("WeekEndRewardExpRate"	  ,	1.5f      );
        RankIntervalSec	  	  	  = file.get_int("RankIntervalSec"		 	  , 600	      );
        MoneyGetFinish     		  = file.get_int("MoneyGetFinish"	 	 	  , -1	      );
        WorldBossCombatCDSec	  = file.get_int("WorldBossCombatCDSec" 	  , 0	      );
        WorldBossCombatCDConsume  = file.get_int("WorldBossCombatCDConsume"	  , -1	      );
        BroadHatchEggQuality	  = file.get_int("BroadHatchEggQuality"	      , 3         );
        BroadVipDay			      = file.get_int("BroadVipDay" 	        	  , 30	      );
        BroadSpriteQuality		  = file.get_int("BroadSpriteQuality"    	  , 3		  );
        BroadArenaCombatCastLimit = file.get_int("BroadArenaCombatCastLimit"  , 50        );
        ChatHistory				  = file.get_int("ChatHistory"  			  , 0         );
        TrainMin				  = file.get_int("TrainMin" 				  , 480		  );
        CompensatePlayerCreateStamp= file.get_int("CompensatePlayerCreateStamp", -1		  );
        CompensateFinish		  = file.get_int("CompensateFinish" 		  , -1		  );
        CompensateReward		  = file.get_int("CompensateReward" 		  , -1		  );
        FriValueAddNum            = file.get_int("FriValueAddNum"    		  , 1		  );
        FriValueAddTimePerDay     = file.get_int("FriValueAddTimePerDay"	  , 20		  );
	    PointrankContinueWinPoints= file.get_int("PointrankContinueWinPoints" , 5		  );
	    PointrankMaxContinueWin	  = file.get_int("PointrankMaxContinueWin"	  , 5		  );
	    PointrankLoseCDSec		  = file.get_int("PointrankLoseCDSec"		  , 10*60     );

	    SecondDayReward			  = file.get_int("SecondDayReward"		  	  , -1     	  );
	    LowRankMedal			  = file.get_int("LowRankMedal"				  , 10		  );
	    MidRankMedal			  = file.get_int("MidRankMedal"				  , 15		  );
	    HeartProtoid			  = file.get_int("HeartProtoid"				  , -1		  );
	    ReleaseHeartRate		  = file.get_int("ReleaseHeartRate"			  , 50		  );
	    InvitedReward		      = file.get_int("InvitedReward"			  , -1		  );
	    PetEvoReward		      = file.get_int("PetEvoReward"  			  , -1		  );
	    PetEvoRewardNeedItemId    = file.get_int("PetEvoRewardNeedItemId"	  , -1		  );
	    GuildMemberNum			  = file.get_int("GuildMemberNum"			  , 15		  );
	    PetCertStar		  		  = file.get_int("PetCertStar"				  , 12		  );
	    PetMedalStar			  = file.get_int("PetMedalStar"				  , 15		  );
	    PetStarGainLast			  = file.get_int("PetStarGainLast" 			  , 30		  );
	    LevelPressPVE		      = file.get_double("LevelPressPVE"		  	  , 0.1		  );
	    LevelPressPVEMax	      = file.get_double("LevelPressPVEMax"		  , 1.0		  );
	    LevelPressPVP		      = file.get_double("LevelPressPVP"		  	  , 0.1		  );
	    LevelPressPVPMax	      = file.get_double("LevelPressPVPMax"		  , 1.0		  );

	    ShareReward				  = file.get_int("ShareReward"				  , -1		  );
	    ShareRewardNum			  = file.get_int("ShareRewardNum"			  , -1		  );
	    CombatRewardTimes		  = file.get_int("CombatRewardTimes"		  , 20		  );

        std::vector<int32_t> nums;

        file.get_nums<int32_t>("PlayerCreateGiveItem", ",", nums);
        if (nums.size() != 3)
            return false;
        for (int i=0; i<3; ++i)
            PlayerCreateGiveItem[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("FriCombatReward", ",", nums);
        if (nums.size() != 4)
            return false;
        for (int i=0; i<4; ++i)
            FriCombatReward[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("DailyOnlineGift", ",", nums);
        if (nums.size() != 3)
            return false;
        for (int i=0; i<3; ++i)
            DailyOnlineGift[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("DailyVipGift", ",", nums);
        if (nums.size() != 3)
            return false;
        for (int i=0; i<3; ++i)
            DailyVipGift[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("LuckyStarMoney", ",", nums);
        if (nums.size() != LuckyStarNum)
            return false;
        for (int i=0; i<LuckyStarNum; ++i)
            LuckyStarMoney[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("RoomNum", ",", nums);
        if (nums.size() != 4)
            return false;
        for (int i=0; i<4; ++i)
            RoomNum[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("BroadLuckyStarIndex", ",", nums);
        if (nums.size() != 4)
            return false;
        for (int i=0; i<4; ++i)
            BroadLuckyStarIndex[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("NSkillUnlockMoney", ",", nums);
        if (nums.size() != 5)
            return false;
        for (int i=0; i<5; ++i)
            NSkillUnlockMoney[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("CreatePet", ",", nums);
        if (nums.size() != 5)
            return false;
        for (int i=0; i<5; ++i)
            CreatePet[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("WeekAccRefreshTime", ",", nums);
        if (nums.size() != 3)
            return false;
        for (int i=0; i<3; ++i)
            WeekAccRefreshTime[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("WorldBossStartHour", ",", nums);
        if (nums.size() != 2)
            return false;
        for (int i=0; i<2; ++i)
        	WorldBossStartHour[i] = nums[i];
        nums.clear();

        file.get_nums<int32_t>("WorldBossStartMin", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			WorldBossStartMin[i] = nums[i];
		nums.clear();

        file.get_nums<int32_t>("WorldBossRandom", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			WorldBossRandom[i] = nums[i];
		nums.clear();

        file.get_nums<int32_t>("WeeklyCntRewardCnt", ",", nums);
		if (nums.size() != cs::WeeklyCntTypeNum)
			return false;
		for (int i=0; i<cs::WeeklyCntTypeNum; ++i)
			WeeklyCntRewardCnt[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("WeeklyCntRewardId", ",", nums);
		if (nums.size() != cs::WeeklyCntTypeNum)
			return false;
		for (int i=0; i<cs::WeeklyCntTypeNum; ++i)
			WeeklyCntRewardId[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("WeeklyCntRewardType", ",", nums);
		if (nums.size() != 4)
			return false;
		for (int i=0; i<4; ++i)
			WeeklyCntRewardType[i] = nums[i];
		nums.clear();


		file.get_nums<int32_t>("DailyPowerStartMin", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			DailyPowerStartMin[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("DailyPowerFinishMin", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			DailyPowerFinishMin[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("UnlockWatchConsume", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			UnlockWatchConsume[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("FriendGiftConsume", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			FriendGiftConsume[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("FriendGiftToGain", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			FriendGiftToGain[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("FriendGiftFromGain", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			FriendGiftFromGain[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("WorldBossCombatReward", ",", nums);
		if (nums.size() != 31)
			return false;
		for (int i=0; i<31; ++i)
			WorldBossCombatReward[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("VentureBossResetNum", ",", nums);
		if (nums.size() != 4)
			return false;
		for (int i=0; i<4; ++i)
			VentureBossResetNum[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("RoomLvlupConsume", ",", nums);
		if (nums.size() != 4)
			return false;
		for (int i=0; i<4; ++i)
			RoomLvlupConsume[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("FloorResetNumConsume", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			FloorResetNumConsume[i] = nums[i];
		nums.clear();

		std::vector<double> fnums;
		file.get_nums<double>("RoomLvlExpRate", ",", fnums);
		if (fnums.size() != 5)
			return false;
		for (int i=0; i<5; ++i)
			RoomLvlExpRate[i] = fnums[i];
		fnums.clear();

		file.get_nums<int32_t>("PointrankHonor", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			PointrankHonor[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("PointrankPoints", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			PointrankPoints[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("PetLvlUpRewardLvl", ",", nums);
		if (nums.size() != 6)
			return false;
		for (int i=0; i<6; ++i)
			PetLvlUpRewardLvl[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("PetLvlUpRewardId", ",", nums);
		if (nums.size() != 6)
			return false;
		for (int i=0; i<6; ++i)
			PetLvlUpRewardId[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("PetStarSkillBand", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			PetStarSkillBand[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("LuckyStarGroupItemProb", ",", nums);
		if (nums.size() != 2)
			return false;
		for (int i=0; i<2; ++i)
			LuckyStarGroupItemProb[i] = nums[i];
		nums.clear();

		file.get_nums<int32_t>("CombatRewardRandSet", ",", nums);
		if (nums.size() != 3)
			return false;
		for (int i=0; i<3; ++i)
			CombatRewardRandSet[i] = nums[i];
		nums.clear();

		file.get_nums<double>("VipExpRate", ",", fnums);
		if (fnums.size() != 4)
			return false;
		for (int i=0; i<4; ++i)
			VipExpRate[i] = fnums[i];
		fnums.clear();

		split(file.get_str("IdPrefix",""), ",", IdPrefix);

		return true;
    }

    void destroy() {
    }

    cfg_file_t file;

    int32_t PetWashMaxLockNum                   ;    // 宠物洗澡最多锁定资质种类数量
    int32_t PetRearExplodeProb                  ;    // 宠物培养xx/10000 * 100% 人民币爆发几率
    int32_t PetRearGameMoneyProb                ;    // 宠物培养xx/10000 * 100% 游戏币成功几率
    int32_t SpriteExplMaxNumMoney               ;    // 每日最大使用人民币探索妖精星星数
    int32_t FriCombatReward[4]                  ;    // 好友切磋奖励0高档，1中档，2低档，3失败
    int32_t FriCombatLevelDiff                  ;    // 好友切磋奖励分当阈值 玩家战斗力+-阈值以外为高档或低档，以内为中档
    int32_t ArenaReward                         ;    // 竞技场每五次挑战奖励
    int32_t ArenaCombatRewardWin                ;    // 竞技场单次挑战奖励
    int32_t ArenaCombatRewardLose               ;    // 竞技场单次挑战奖励
    int32_t HatchEggUnlock3Consume              ;    // 开锁孵化槽3消耗
    int32_t HatchEggUnlock4Consume              ;    // 开锁孵化槽4消耗
    int32_t PlayerCreateGivePet                 ;    // 创建角色时给的宠物id
    int32_t PlayerCreateGiveItem[3]             ;    // 创建角色时给的物品id逗号分开，最多3个
    int32_t ArenaCombatNumPerDay                ;    // 竞技场每日挑战次数
    int32_t PowerIncMinute                      ;    // 体力恢复时间单位分钟
    int32_t MaxPower                            ;    // 最大体力
    int32_t MaxOccupyNum                        ;    // 占领最大次数
    int32_t ArenaRankRewardMinute               ;    // 竞技场排名奖励发放时间 0-59 分钟
    int32_t ArenaRankRewardHour                 ;    // 竞技场排名奖励发放时间 0-23 小时

    int32_t DailyOnlineGift[3]                  ;    // 连续上线奖励
    int32_t DailyVipGift[3]                     ;    // vip上线奖励
    int32_t PlayerMedalInit                     ;    // 勋章初始值
    int32_t EquipStarInit                       ;    // 装备初始星级
    int32_t AttackAngryAddProb                  ;    // 普通攻击涨怒气几率
    int32_t SkillAngryAddProb                   ;    // 技能攻击涨怒气几率
    int32_t LuckyStarNum                        ;    // 每日最大幸运星次数
    int32_t LuckyStarMoney[200]                 ;    // 幸运星消耗天使比，最大次数200
    int32_t LuckyStarRandSet                    ;    // 幸运星随机集合
    int32_t NSkillUnlockMoney[5]                ;    // 开启魔法印记槽消耗，依次为6-10槽 填逗号分开的数字5个
    int32_t FirstChargeRewardId                 ;    // 首充送礼

    int32_t WeekAccRefreshTime[3]               ;    // 周开始时间 "周几,几点,几分"
    int32_t CreatePet[5]                        ;    // 开始时可创建的宠物

    int32_t BuyArenaCombatConsume               ;    // 购买竞技场挑战次数消耗
    int32_t BuyOccupationConsume                ;    // 购买占坑次数消耗
    int32_t ArenaCritCombatConsume              ;    // 竞技场突袭消耗
    int32_t FriendCombatRewardNum	            ;    // 好友挑战奖励次数
    int32_t MaxMailBoxNumOnline                 ;    // 最多缓冲的邮箱数量
    int32_t ChatChannelSize					    ;	 // 聊天频道容量

    int32_t WorldBossStartHour[2]			    ;	 // 世界boss开始小时
    int32_t WorldBossStartMin[2]			    ;	 // 世界boss开始分钟
    int32_t WorldBossLastMin	  			    ;	 // 世界boss持续分钟
    int32_t WorldBossRandom[3]  			    ;	 // 世界boss可能随机种类
    int32_t WorldBossLastAttackReward		    ;	 // 世界boss幸运一击奖励
    int32_t WorldBossCombatConsume			    ;	 // 世界boss战斗消耗
    int32_t WorldBossCombatTime				    ;	 // 世界boss战斗次数
    int32_t WorldBossCombatReward[31]		    ;	 // 世界boss战斗奖励boss20-50level
    int32_t WorldBossCombatCDSec			    ;	 // 世界boss战斗冷却时间(分钟)
    int32_t WorldBossCombatCDConsume		    ;	 // 世界boss忽略冷却的消耗
    int32_t WeeklyCntRewardCnt[cs::WeeklyCntTypeNum];	 // 周奖励达标数
    int32_t WeeklyCntRewardId[cs::WeeklyCntTypeNum] ;	 // 周奖励id
    int32_t WeeklyCntRewardType[4] 				;	 // 周奖励种类

    int32_t DailyPowerStartMin[2];
    int32_t DailyPowerFinishMin[2];
    int32_t DailyPowerNum;

    double WeekEndRewardExpRate;				;	 // 周末奖励经验倍数
    double ActNumAddPctPerSpeed				    ;	 // 每点速度加行动次数几率

    int32_t RankIntervalSec						;	 // 排行间隔秒
    int32_t UnlockWatchConsume[2]				;	 // 解锁观战位置消耗，2个
    int32_t FriendGiftConsume[3]				;	 // 好友送礼的三个消耗
    int32_t FriendGiftFromGain[3]				;	 // 好友送礼的三个赠送玩家的奖励
    int32_t FriendGiftToGain[3]					;	 // 好友送礼的三个获得玩家的奖励

    int32_t MoneyGetFinish						;	 // 天使大方送结束时间
    int32_t VentureBossResetNum[4]				;	 // 冒险boss重置次数0是最普通的次数,1-3分表时vip1-vip3的次数

    int32_t BroadLuckyStarIndex[4]              ;    // 幸运星广播的索引
    int32_t BroadArenaCombatCastLimit           ;    // 竞技场战斗广播最小排名
    int32_t BroadHatchEggQuality				;	 //
    int32_t BroadVipDay							;	 //
    int32_t BroadSpriteQuality					;	 //
    int32_t ChatHistory							;

    int32_t RoomNum[4]							;	 // room num of 0:normalplayer 1-3:vip1-3
    int32_t TrainMin							;	 // train time in minute
    int32_t RoomLvlupConsume[4]					;	 // consume for levelup room
    double RoomLvlExpRate[5]					;	 // exprate of room level

    int32_t CompensatePlayerCreateStamp			;	 // player who has create stamp before this can gain compensate
    int32_t CompensateFinish					;	 // timestamp of compensate finish
    int32_t CompensateReward					;	 // compensate rewardid

    int32_t FloorResetNumConsume[3]				;
    int32_t FriValueAddNum       				;    // 涨亲密度
    int32_t FriValueAddTimePerDay  				;    // 涨亲密度

    int32_t PointrankHonor[2]					;	 // 荣誉奖励0 赢 1 输
    int32_t PointrankPoints[2]					;	 // 积分奖励0 赢 1 输
    int32_t PointrankContinueWinPoints 			;	 // 连胜积分奖励
    int32_t PointrankMaxContinueWin 			;	 // 最高连胜次数
    int32_t PointrankLoseCDSec		 			;	 // 输的冷却时间

    int32_t SecondDayReward						;	 // 次日留存奖励
    int32_t LowRankMedal						;	 // 菜鸟榜勋章上限 < 这个值的是菜鸟
    int32_t MidRankMedal						;	 // 菜鸟2榜勋章上限 < 这个值的是菜鸟2
    int32_t HeartProtoid						;	 // 爱心原型id
    int32_t ReleaseHeartRate					;	 // 放生返还爱心比例0-100
    int32_t InvitedReward						;	 // 被邀请进来领取的奖励id
    int32_t PetEvoRewardNeedItemId 				;	 // 宠物进化奖励指定进化证
    int32_t PetEvoReward						;	 // 宠物进化奖励
    int32_t PetLvlUpRewardLvl[6]				;	 // 宠物升级奖励等级
    int32_t PetLvlUpRewardId[6]					;	 // 宠物升级奖励id
    int32_t PetStarSkillBand[3]					;	 // 宠物达到此星时更换下一星技能
    int32_t GuildMemberNum						;	 // 帮派成员数
    int32_t GuildCreateConsume					;	 // 创建帮派消耗
    int32_t PetCertStar							;	 // 达到此星可以领证书
    int32_t PetMedalStar						;	 // 达到此星可以领勋章
    int32_t PetStarGainLast						;	 // 领证书勋章的持续时间 天

    int32_t LuckyStarGroupItemProb[2]			;	 // 组内条目几率
    int32_t CombatRewardRandSet[3]				;	 // pve战斗奖励的三个randset
    int32_t CombatRewardTimes					;
    std::vector<std::string> IdPrefix			;	 // 身份前缀
    double VipExpRate[4]						;	 // vip Exp Rate, 0 for none exp player
    double LevelPressPVE							;	 // level press
    double LevelPressPVEMax						;	 // max level press
    double LevelPressPVP							;	 // level press
    double LevelPressPVPMax						;	 // max level press
    int32_t ShareReward							;	 // share reward
    int32_t ShareRewardNum						;	 // share reward num
};

#endif /* GAME_CFG_H_ */

